package ejecutables;

import gramaticaANTLR.GramaticaLexer;
import gramaticaANTLR.GramaticaParser;
import gramaticaPrecedencia.ConflictoTabla;
import gramaticaPrecedencia.GramaticaPrecedenciaSimple;
import gramaticaPrecedencia.GramaticaSerializable;

import java.io.IOException;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;

public class GramaticaYTabla {

	/**
	 * Chequea la gramática y en caso de éxito arma su tabla.
	 * @param args
	 * 			0 - gramatica.txt
	 * 			1 - archivo xml de salida.
	 */	
	public static void main(String[] args) {
		GramaticaLexer lex = null;
		try {
			lex = new GramaticaLexer(new ANTLRFileStream(args[0]));
		} catch (IOException e1) {
			e1.printStackTrace();
		}
        CommonTokenStream tokens = new CommonTokenStream(lex);
        System.out.println("emepezando...");
        GramaticaParser g = new GramaticaParser(tokens);
        try {
            g.gramatica();
        }
        catch (RecognitionException e) {
        	System.out.println("Se ha encontrado un error:");
            e.printStackTrace();
            if (e.token != null) {
            	System.out.println(e.token.toString());
            }
            System.exit(1);
        }
        catch (RuntimeException e) {
        	System.err.println("El lexer ha detectado un error.");
        	System.exit(2);
        }
        

        System.out.println(g.getGramatica().toString());
        
        if (g.getGramatica().isApta()) {
            GramaticaPrecedenciaSimple gp = new GramaticaPrecedenciaSimple(g.getGramatica());
            try {
            	gp.armarTabla();
            	System.out.println("Tabla:\n");
            	System.out.println(gp.getTabla().toString());
            	GramaticaSerializable obj = new GramaticaSerializable(gp.getTabla(),
            			gp.getGramatica().getSimboloInicial(),
            			gp.getGramatica().getProducciones(),
            			gp.getGramatica().getTerminales());
            	obj.serializar(args[1]);
            }
            catch (ConflictoTabla e) {
				System.out.println("¡Conflicto en la tabla!");
				System.out.println("Símbolos: " + e.getPar().toString());
				System.out.println("Relacion en tabla: ."+e.getConfAntiguo() + 
						" Relacion nueva ." + e.getConfnuevo());
				System.out.println("Tabla:\n");
				System.out.println(e.getTabla().toString());
			}
            catch (IOException e) {
				e.printStackTrace();
			}
        }
        else {
        	System.out.println("La gramática no es de precedencia simple");
        }

	}

}
